Load pngs without gdk-pixbuf
authorMatthias Clasen <mclasen@redhat.com>
Sat, 11 Sep 2021 20:23:53 +0000 (16:23 -0400)
committerBenjamin Otte <otte@redhat.com>
Thu, 16 Sep 2021 22:25:22 +0000 (00:25 +0200)
Use our own loader for pngs, which will allow
us to get e.g. 16-bit data in the future.

gdk/gdktexture.c

index 4ef7cb5e9700016a4894c89b2c5529b3cc83cd06..8d2d1d16caee6ec2f4527c0e18dbcee561e6eeab 100644 (file)
@@ -46,6 +46,7 @@
 #include "gdksnapshot.h"
 
 #include <graphene.h>
+#include "loaders/gdkpngprivate.h"
 
 G_DEFINE_QUARK (gdk-texture-error-quark, gdk_texture_error)
 
@@ -423,24 +424,40 @@ GdkTexture *
 gdk_texture_new_from_bytes (GBytes  *bytes,
                             GError **error)
 {
-  GInputStream *stream;
-  GdkPixbuf *pixbuf;
-  GdkTexture *texture;
+  const char *data;
+  gsize size;
 
   g_return_val_if_fail (bytes != NULL, NULL);
   g_return_val_if_fail (error == NULL || *error == NULL, NULL);
 
-  stream = g_memory_input_stream_new_from_bytes (bytes);
-  pixbuf = gdk_pixbuf_new_from_stream (stream, NULL, error);
-  g_object_unref (stream);
+  data = g_bytes_get_data (bytes, &size);
 
-  if (pixbuf == NULL)
-    return NULL;
+  if (size > strlen (PNG_SIGNATURE) &&
+      memcmp (data, PNG_SIGNATURE, strlen (PNG_SIGNATURE)) == 0)
+    {
+      return gdk_load_png (bytes, error);
+    }
+  else
+    {
+      GInputStream *stream;
+      GdkPixbuf *pixbuf;
 
-  texture = gdk_texture_new_for_pixbuf (pixbuf);
-  g_object_unref (pixbuf);
+      stream = g_memory_input_stream_new_from_bytes (bytes);
+      pixbuf = gdk_pixbuf_new_from_stream (stream, NULL, error);
+      g_object_unref (stream);
 
-  return texture;
+      if (pixbuf)
+        {
+          GdkTexture *texture;
+
+          texture = gdk_texture_new_for_pixbuf (pixbuf);
+          g_object_unref (pixbuf);
+
+          return texture;
+        }
+    }
+
+  return NULL;
 }
 
 /**